<!--
 * @Description:
 * @version:
 * @Author: 尹鹏孝
 * @Date: 2023-03-02 13:46:19
 * @LastEditors: 尹鹏孝
 * @LastEditTime: 2023-03-03 09:04:16
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型</title>
</head>
<body>
<script>
    var myObject ={
        a:2
    };
    console.log(myObject.a)

    //原型和原型链，原型离不开继承为基础,''


// 继承：每个实例对象都有一个私有属性__proto__.指向他的构造函数原型prototype。该原型对象也有一个自己的原型对象也是__proto__。层层向上直到有一个对象的为null，这种原型继承的被称为原型链
    // 使用不同方法来创建对象和生成器原型链接

    // 使用语法结构创建
    // JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时，它不仅仅在该对象上搜寻，还会搜寻该对象的原型，以及该对象的原型的原型，依次层层向上搜索，直到找到一个名字匹配的属性或到达原型链的末尾。
    var o={
        a:1
    };
    var a=["ya","whadup","?"];
    function f(){
        return 2;
    }


    // 使用构造器创建对象
    function Graph(){
        this.vertail=[]
        this.edge=[];
    }
    Graph.prototype={
        addVer:function(v){
            this.vertail.push(v)
        }
    }

    var g = new Graph()

    // 使用Object.create创建对象
    var pps={a:1};
    var bbs=Object.create(pps);

    console.log(a)

    var c = Object.create(bbs);

    var d = Object.create(null);
//使用class关键字创建
"use static"

class Polygon{
    constructor(height,width){
        this.height=height;
        this.width=width;
    }
}


class Square extends Polygon{
    constructor(sideLength){
        super(sideLength,sideLength)
    }

    get area(){
        return this.height*this.width;
    }
    set sideLength(newLength){
        this.height = newLength
        this.width = newLength;
    }
}

    var square = new Square(2);

    console.log(square.area)
//myObject.foo=“把人“会出现你几种情况？
// 1、原型prototype链上层存在foo的普通访问属性，并且没有被标记为只读，那就会直接在myObject中添加一个名为foo属性，他说屏蔽属性
// 2prototype上层存在foo,但是提示只读，writeable是false，那么无法修改已有属性或者创建属性，严格模式会报错，否则会忽略。
// 3、prototype链接上层存在一个foo并且是setter,那一定会调用setter，foo不会被添加到myObject。也不会重新定义这个setter。

var anotherObject ={
    a:2
};
var myObject = Object.create(anotherObject);
console.log(anotherObject.a);
    console.log(myObject.a);

 anotherObject.hasOwnProperty("a");
 myObject.hasOwnProperty("a");
 console.log(myObject.a++);
 console.log(anotherObject.a);
 console.log(myObject.a);

 Object.defineProperty(Object.prototype,"__proto__",{
    get:function(){
        return Object.getPrototypeOf(this)
    },
    set:function(o){
        Object.setPrototypeOf(this,o);
        return o;
    }
 })
</script>
</body>
</html>